package com.geek.javase.ch18.work.work5;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/*
 *@Date 2025/11/7
 *@Author wangpeng
 *@Description
 * 代理对象 proxy
 */
/*
public class DynamicProxyCalculateLog implements InvocationHandler {
    //目标对象
    private ICalculator target;
    public DynamicProxyCalculateLog(ICalculator target) {
        this.target = target;
    }

    public ICalculator getProxy() {
        //1.类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        //2.实现接口
        Class<?>[] interfaces = target.getClass().getInterfaces();

        return (ICalculator) java.lang.reflect.Proxy.newProxyInstance(classLoader, interfaces, this);
    }
    */
/**
     * 执行目标方法
     * @param proxy  代理对象（不用的）
     * @param method 目标对象中的方法对象
     * @param args   目标对象中的方法形参列表
     * @return 目标对象中的方法的返回值，若目标方法没有返回值则是null，若目标方法有返回值则是object
     * @throws Throwable
     *//*

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //获得执行的目标方法的方法名称
        String name = method.getName();
        System.out.println("日志追踪开始:The Method "+name+" begin with["+ Arrays.toString(args)+"]");

        //执行目标方法
        Object invoke = method.invoke(target, args);

        System.out.println("日志追踪结束:The Method "+name+" end with "+invoke);
        return invoke;
    }
}
*/
//代理对象 proxy
public class DynamicProxyCalculateLog {
    //目标对象
    private ICalculator target;
    public DynamicProxyCalculateLog(ICalculator target) {
        this.target = target;
    }

    public ICalculator getProxy() {
        //代理对象 proxy
        ICalculator proxy = null;
        //1.类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        //2.实现接口
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //3.执行处理器
        InvocationHandler handler = new InvocationHandler(){
            /**
             * 执行目标方法
             * @param proxy  代理对象（不用的）
             * @param method 目标对象中的方法对象
             * @param args   目标对象中的方法形参列表
             * @return 目标对象中的方法的返回值，若目标方法没有返回值则是null，若目标方法有返回值则是object
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //获得执行的目标方法的方法名称
                String name = method.getName();
                System.out.println("日志追踪开始:The Method "+name+" begin with["+ Arrays.toString(args)+"]");
                //执行目标方法
                Object invoke = method.invoke(target, args);
                System.out.println("日志追踪结束:The Method "+name+" end with "+invoke);
                return invoke;
            }
        };
        proxy =(ICalculator) java.lang.reflect.Proxy.newProxyInstance(classLoader, interfaces,handler);
        return proxy;
    }
}

